package org.gilgamesh.stool.search.es;

import org.gilgamesh.stool.search.SearchRequest;

/**
 * Elastic Search查询抽象类
 *
 * @author Gilgamesh
 * @since 2021-08-20
 **/
public abstract class AbstractESRequest implements SearchRequest {

    /* 查询的数量上限，默认为负数，不设上限 */
    private int size;

    /* 查询的索引名称 */
    private String indexName;

    /**
     * 希望被查询出来的结果包含的字段，未设置则代表查询所有
     **/
    private String[] needFields;

    /**
     * 希望被查询出来的结果不包含的字段
     **/
    private String[] unNeedFields;

    public AbstractESRequest() {
        /* 不设上限 */
        this.size = -1;
    }

    /**
     * 设置ES查询结果集的上限
     **/
    @Override
    public AbstractESRequest setSize(int size) {
        this.size = size;
        return this;
    }

    @Override
    public int size() {
        return size;
    }

    /**
     * 设置索引名称
     **/
    public AbstractESRequest indexName(String indexName) {
        this.indexName = indexName;
        return this;
    }

    /**
     * 获取索引名称
     **/
    public String indexName() {
        return this.indexName;
    }

    /**
     * 是否设置了不需要的字段
     **/
    public boolean hasUnNeedField() {
        return unNeedFields == null || unNeedFields.length <= 0;
    }

    /**
     * 获取不需要的字段
     **/
    public String[] unNeedFields() {
        return this.unNeedFields;
    }

    /**
    * 设置不需要的字段
    **/
    public AbstractESRequest unNeedFields(String[] unNeedFields) {
        this.unNeedFields = unNeedFields;
        return this;
    }

    /**
     * 设置需要的字段
     **/
    public AbstractESRequest needFields(String[] needFields) {
        this.needFields = needFields;
        return this;
    }

    /**
     * 获取需要的字段
     **/
    public String[] needFields() {
        return this.needFields;
    }

    /**
     * 是否设置了需要的字段
     **/
    public boolean hasNeedField() {
        return needFields != null && needFields.length > 0;
    }


    /**
     * 是否需要按照时间范围查询
     **/
    public abstract boolean isRangeTime();

    /**
     * 是否需要排序
     **/
    public abstract boolean isSorted();
}
